

#include	"config.h"
#include	"STC32G_Timer.h"
#include	"STC32G_GPIO.h"
#include	"STC32G_NVIC.h"

#include    "drv_jiffes.h"


static jiffes_t jiffes={0}; // 系统jiffes时间

/**
 * @brief   获取系统jiffes句柄
 * @param   无
 * @return  返回系统@jiffes_t类型指针
 */
jiffes_t* jiffes_handler(void)
{
    return &jiffes;
}

void jiffes_reset(void)
{
    jiffes.s = 0;
    jiffes.ms = 0;
}

/**
 * @brief   获取当前系统jifees时间
 * @param   jiffes_t类型指针
 * @return  无
 */
void jiffes_get(jiffes_t* j)
{
    j->s = jiffes.s;
    j->ms = jiffes.ms;
}

/**
 * @brief   归零指定jifees时间
 * @param   jiffes_t类型指针
 * @return  无
 */
void jiffes_zero(jiffes_t* j)
{
    j->s = 0;
    j->ms = 0;
}

/**
 * @brief   指定jiffes时间增加ms毫秒时间
 * @param   j:jiffes_t类型指针
 * @param   ms:增加的毫秒数
 */
void jiffes_add_ms(jiffes_t* j, uint32 ms)
{   
    j->s += (uint32)(ms/1000);    /* 增加的秒数 */
    j->ms += (uint32)(ms%1000);   /* 增加的毫秒 */
    if (j->ms > 1000) {
        j->s += (uint32)(j->ms/1000);
        j->ms = (uint32)(j->ms%1000);
    }
}

/**
 * @brief   将当前系统
 */
void jiffes_now_add_ms(jiffes_t* j, uint32 ms)
{
    j->s = jiffes.s + (uint32)(ms/1000);    /* 增加的秒数 */
    j->ms = jiffes.ms + (uint32)(ms%1000);   /* 增加的毫秒 */
    if (j->ms > 1000) {
        j->s += (uint32)(j->ms/1000);
        j->ms = (uint32)(j->ms%1000);
    }
}


/**
 * @brief   两个jiffes时间做比较
 * @param   ja:第一个jiffes
 * @param   jb:第二个jiffes
 * @return  ja>jb返回1, ja<jb返回-1，ja==jb返回0 
 */
int8 jiffes_compare(jiffes_t* ja, jiffes_t* jb)
{
    int8 ret=0;
    if ((ja->s == jb->s)&&(ja->ms == jb->ms)) {
        ret = 0;   // 当前秒数 等于 传入的秒数

    } else if ((ja->s > jb->s)||((ja->s == jb->s)&&(ja->ms > jb->ms))) {
        ret = 1;   // 当前秒数 大于 传入的秒数

    } else {
        ret = -1;  // 当前秒数 小于 传入的秒数
    }
    return ret;
}


/**
 * @brief   指定jiffes和系统jiffes时间比较
 * @param   j:传入的jiffes指针
 * @return  系统jiffes时间大于传入的jiffes时间返回1，小于传入的jiffes时间返回-1，等于传人的jiffes时间返回0
*/
int8 jiffes_compare_now(jiffes_t* j)
{
    int8 ret = 0;
    if ((jiffes.s == j->s)&&(jiffes.ms == j->ms)) {
        ret = 0;   // 当前秒数 等于 传入的秒数

    } else if ((jiffes.s > j->s)||((jiffes.s == j->s)&&(jiffes.ms > j->ms))) {
        ret = 1;   // 当前秒数 大于 传入的秒数

    } else {
        ret = -1;  // 当前秒数 小于 传入的秒数
    }
    return ret;
}


/**
 * @brief   获取指定时间和当前时间差值
 * @param   j指定时间@jiffes_t类型指针
 * @return  返回时间差值，大于0当前时间大于指定时间，小于0当前时间小于指定时间 单位毫秒
*/
int32 jiffes_diff_now(jiffes_t *j)
{
    int32 diff=0;
    if ((j->s == 0)&&(j->ms == 0)) {
        diff = ((int32)(jiffes.s - j->s)*1000)+((int32)jiffes.ms);
    } else {
        diff = ((int32)(jiffes.s - j->s)*1000)+((int32)(jiffes.ms - j->ms));
    }

    // log_d(">>>>>>diff:%d, jiffes:%d-%d, j:%d-%d\n", (int)diff, (int)jiffes.s, (int)jiffes.ms, (int)j->s, (int)j->ms);
    return (int32)diff;
}


void drv_jiffes_config(void)
{
    TIM_InitTypeDef		TIM_InitStructure;					//结构定义
	TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	//指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
	TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;		//指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
	TIM_InitStructure.TIM_ClkOut    = DISABLE;				//是否输出高速脉冲, ENABLE或DISABLE
	TIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / 1000UL));		//初值,
	TIM_InitStructure.TIM_PS        = 0;					//8位预分频器(n+1), 0~255
	TIM_InitStructure.TIM_Run       = ENABLE;				//是否初始化后启动定时器, ENABLE或DISABLE
	Timer_Inilize(Timer0,&TIM_InitStructure);				//初始化Timer0	  Timer0,Timer1,Timer2,Timer3,Timer4
	NVIC_Timer0_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}

void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR		//进中断时已经清除标志
{
	// TODO: 在此处添加用户代码
	// P67 = ~P67;
    
    /* TIMER0 产生1MS系统滴答时间 */
    jiffes.ms += 1;
    if (jiffes.ms == 1000) {    
        // ms==1000,即1S，秒增加1
        jiffes.ms = 0;
        jiffes.s += 1;
    }
}

